﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using miniCCR;

namespace SimpleGameAppCCR.NComp
{


    class Map
    {
        public List<Movable> _List = new List<Movable>();
    }

    enum COMID : uint
    {
        MOVABLE = 1,
        SPRITE,
        SPRITECM,
    }


    public class Movable_Proxy : miniCCR.Proxy
    {
        public Movable_Proxy(GComponent from, GComponent to) : base(from,to)
        {

        }
    }

    class Movable : miniCCR.GComponent
    {

        

        public override uint _ComID
        {
            get { return (uint)COMID.MOVABLE; }
        }


        public override string GetProxyName()
        {
            return typeof(Movable_Proxy).Name;
        }

        public override miniCCR.Proxy GetProxy(GComponent from)
        {
            Movable_Proxy proxy = new Movable_Proxy(this,from);


            return proxy;
        }



        static Map _Map = new Map();

        Vector2 _Vel = new Vector2(2, 2);
        
        public Movable()
        {
            _Map._List.Add(this);
            
        }

        //public override String GetCompType()
        //{
        //    return typeof(Movable).Name;
        //}

        // 
        public override IEnumerator<miniCCR.iTask> OnMessage(miniCCR.Operation op)
        {
            
            if(  op.ToString() == typeof(Operation.UpdateTick).ToString())
            {
                return UpdateHandle(op as Operation.UpdateTick);
            }else 
            {

            }

            return null;
        }

        private IEnumerator<iTask> UpdateHandle(SimpleGameAppCCR.Operation.UpdateTick updateTick)
        {
            Sprite_Proxy sprite = miniCCR.ccrMain.I.GetProxy<Sprite_Proxy>( this);

            Operation.GetPosition pos = new SimpleGameAppCCR.Operation.GetPosition();

            yield return sprite.GetPosition( pos);

            


            


            if (pos._Pos.X < 0 || pos._Pos.Y < 0)
                _Vel = new Vector2(2, 2);

            if (600 < pos._Pos.X || 400 < pos._Pos.Y)
                _Vel = new Vector2(-2, -2);



            //foreach (Movable obj in _Map._List)
            //{
            //    if (obj != this)
            //    {
            //        Sprite_Proxy otherSprite = miniCCR.ccrMain.I.GetProxy<Sprite_Proxy>(this,obj._Owner._ID);

            //        Operation.GetPosition otherPos = new SimpleGameAppCCR.Operation.GetPosition();

            //        yield return otherSprite.GetPosition(otherPos);

            //        if (Vector2.Distance(pos._Pos, otherPos._Pos) < 50)
            //        {
            //            _Vel = -_Vel;
            //        }
            //    }
            //}

            pos._Pos += _Vel;

            Operation.SetPosition setPos = new SimpleGameAppCCR.Operation.SetPosition();
            setPos._Pos = pos._Pos;

            yield return sprite.SetPosition(setPos);

            yield break;
        }
    }
}



//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using Microsoft.Xna.Framework;
//using System.Drawing;

//namespace SimplaGameApp.NComp
//{


//    class Map
//    {

//        public QuadTreeLib.QuadTree<Movable> _QuadTree = new QuadTreeLib.QuadTree<Movable>(new RectangleF(0, 0, 1024, 1024));

//        public void Add(Movable obj)
//        {
//            _QuadTree.Insert(obj);
//        }



//        //public List<Movable> _List = new List<Movable>();
//    }

//    class Movable : GOCS.GComponent , QuadTreeLib.IHasRect<Movable>
//    {
//        static Map _Map = new Map();
        
//        public Movable()
//        {
//            _Map.Add(this);

//        }

//        RectangleF _Rectangle = new RectangleF();

//        public RectangleF Rectangle { 
//            get {
//                return _Rectangle; 
//            }
//            set{
//                _Rectangle = value;
//            }
//        }
//        public QuadTreeLib.QuadTreeNodeBase<Movable> _Node;

//        public QuadTreeLib.QuadTreeNodeBase<Movable> Node
//        {
//            get
//            {
//                return _Node;
//            }
//            set
//            {
//                _Node = value;
//            }

//        }


        
//        public override String GetCompType()
//        {
//            return typeof(Movable).Name;
//        }

//        public void Update()
//        {
//            Sprite sprite = _Owner.getComponent<Sprite>();

//            sprite._mPosition.X += Game1._Rand.Next(5) -2;
            
//            sprite._mPosition.Y += Game1._Rand.Next(5)-2;

            



//            //foreach (Movable obj in _Map._List)
//            //{
//            //    if (obj != this)
//            //    {
//            //        Sprite otherSprite = obj._Owner.getComponent<Sprite>();

                    

//            //        if (sprite._mPosition.X == otherSprite._mPosition.X
//            //            && sprite._mPosition.Y == otherSprite._mPosition.Y)
//            //        {
//            //            sprite._mPosition.X += Game1._Rand.Next(5) - 2;

//            //            sprite._mPosition.Y += Game1._Rand.Next(5) - 2;

//            //        }
//            //    }
//            //}

//        }

//    }
//}

